import greenfoot.*;  // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)

/**
 * El objetivo de esta clase es mover a spidemrna y utilizar las herramientas para desplazarse por la cuidad
 * 
 * @author Jose Luis Sandoval Quintero
 * @version 5-Junio-2012
 */
public class Spiderman extends Jugador
{
    private int dir = 0; //indica la direccion de spiderman izquierda o derecha
    private boolean altMaxBrinco = false; // bandera que indica cuando llego al final del brinco
    private boolean brinco = false; //bandera que indica si el actor brinco
    private boolean esCaida = true; // bandera que indica si es brinco o esta Cayendo
    private boolean sigBala = true; //bandera que indica si se puede lanzar la siguiente bala
    private boolean band = false; //bandera que solo te permite evaluar una sola vez el brinco de spiderman
    private boolean lanzoTelarana = false; //bandera que indica cuando se lanzo 
    private boolean dirang = false; //bandera que indica el fin del incremento del angulo
    private int cont = 0; // contador para indicar cuanto tiene que saltar spiderman
    private int nFondo = 0; //variable que indica cual escenario de fondo se tiene que mostrar
    private int x; //coordenada en x de donde se hizo clic con el raton para colgarse de la telaraña
    private int y; //coordenada en x de donde se hizo clic con el raton para colgarse de la telaraña
    private Telarana telarana; //Telaraña que avienta spiderman para colgarse de los edificios
    private double xr; //variable que guarda la nueva posicion en x de spiderman en el movimiento de la telarana.
    private double yr; //variable que guarda la nueva posicion en y de spiderman en el movimiento de la telarana.
    private double radio; //variable para guardar el radio desde la posicion de spiderman hasta donde se dio click.
    private double angulo; //variable auxiliar para el movimiento circular de spiderman.
    private double angulo2;//variable de angulo en radianes para generar las nuevas posiciones de spiderman.
    private double ang3;//auxiliar para detener el movimiento circular de spiderman.

    /**
     * Metodo que hace que spiderman se mueva, brinque, lance la telaraña y dispare
     */
   public void act() 
   {
    
       if( Greenfoot.mouseClicked( null ) )
       {
           Actor e;
           MouseInfo raton = Greenfoot.getMouseInfo();
           e = raton.getActor();
           getWorld().removeObjects( getWorld().getObjects( Telarana.class ) );
           lanzoTelarana = false;
           dirang = false;
           if( e instanceof Colgantes )
           {
               lanzoTelarana = false;
                x = raton.getX();
                y = raton.getY();
                xr = super.getX() - x;
                yr = super.getY() - y;
                radio = Math.sqrt( ( xr * xr + yr * yr ) );
                angulo2 = Math.atan( yr / xr );
                angulo = - ( angulo2 * 180 / Math.PI ) + 180;
                ang3 = -(angulo-180)+360;
       
                if( super.getX() > x )
                {
                    angulo = angulo + 180;
                    ang3 = 540 - angulo;
                }
     
                telarana = new Telarana();
                getWorld().addObject( telarana, getWorld().getWidth()/2, getWorld().getHeight()/2 );
                telarana.creaImagen( x, y, super.getX(), super.getY() );
                telarana.dibuja();
                dirang = true;
                lanzoTelarana = true;
            }
       }
       if( lanzoTelarana )
       {
           telarana.creaImagen( x, y, super.getX(), super.getY()  );
           telarana.dibuja();
           if( angulo <= ang3&&dirang )
           {
               angulo++;
               super.setImage( "spiderman5.png" );
           }
           if( angulo > ang3 &&dirang)
           {
                angulo--;
                super.setImage( "spiderman5_2.png" );
           }
           if( (int)angulo == (int)ang3 || (int)angulo+1 == (int)ang3 )
           {
               dirang = false;
               brinco = true;
               lanzoTelarana = false;
               getWorld().removeObjects( getWorld().getObjects( Telarana.class ) );
           }
           angulo2 = Math.toRadians( angulo );
           xr = Math.cos( angulo2 ) * radio;
           yr = Math.sin( angulo2 ) * radio;
           super.setLocation( x + (int)xr, y - (int)yr );
       }
       if( avanzaFondo() && ((SpidermanWorld)getWorld()).getNivel() == 0 ) 
       {
            getWorld().removeObjects( getWorld().getObjects( Edificio.class ) );
                setEdificios();
       }
       if( Greenfoot.isKeyDown( "space" ) && sigBala)
       {
            Actor bala;
            SpidermanWorld mundo = (SpidermanWorld)getWorld();
            if( dir == 0 )
                 bala = new Bala( 0, this );
            else
                bala = new Bala( 1, this );
            super.getWorld().addObject( bala, super.getX(), super.getY() - 20 );
            mundo.cambiaNbalas( (mundo.dameNbalas())-1 );
            sigBala = false;
       }
       if( esTecho() && ! brinco )
       {
           if( ! esEdificio() )
            move( -1 );
           if( esEdificio() && ((SpidermanWorld)getWorld()).getNivel() == 2 )
            move( -1 );
            if( dir == 0 )
                super.setImage( "spiderman4.png" );
            else
                super.setImage( "spiderman4_2.png" );
            if( Greenfoot.isKeyDown( "right" ) )
            {
                dir = 0;
                super.setImage( "spiderman1.png" );
                move( 3 );
            }
            if( Greenfoot.isKeyDown( "left" )  )
            {
                dir = 1;
                super.setImage( "spiderman1_2.png" );
                move( -3 );
            }
            if( Greenfoot.isKeyDown( "down" ) )
            {
                if( dir == 0 )
                    super.setImage( "spiderman4.png" );
                else
                    super.setImage( "spiderman4_2.png" );
            }
            if( Greenfoot.isKeyDown( "up" ) )
            {
                if( dir == 0 )
                    super.setImage( "spiderman5.png" );
                else
                    super.setImage( "spiderman5_2.png" );
                brinco = true;
            }
        }
        else
        {
            if( Greenfoot.isKeyDown( "right" ) )
            {
                dir = 0;
                super.setImage( "spiderman5.png" );
                move( 2 );
            }
            if( Greenfoot.isKeyDown( "left" )  )
            {
                dir = 1;
                super.setImage( "spiderman5_2.png" );
                move( -2 );
            }
            if( brinco )
            {
                cont++;
                if( cont <= 30 )
                    super.setLocation( super.getX(), super.getY() - 4 );
                else
                {
                    cont = 0;
                    brinco = false;
                }
                    
            }
            else
                super.setLocation( super.getX(), super.getY() + 2  );
        }
        if( esPizo() )
        {
                SpidermanWorld mundo =(SpidermanWorld)getWorld();
                getWorld().removeObjects( getWorld().getObjects( Telarana.class ) );
                lanzoTelarana = false;
                //mundo.cambiaNvidas( mundo.dameNvidas() - 1 );
                super.setLocation( 30, 50 );
        }
    }   
    /**
     * Regresa true si spiderman intersecto sobre un edificio
     * de lo contrario regresa false
     */
    public boolean esEdificio()
    {
        boolean res = false;
        Actor edificio = getOneIntersectingObject( Edificio.class );
        if( edificio != null )
            res = true;
        return res;
    }
    /**
     * Regresa true si spiderman esta posicionado en la parte de arriba de un edificio
     * de lo contrario regresa false
     */
    public boolean esTecho()
    {
        boolean res = false;
        int ancho;
        int alto;
        int x;
        int y;
        GreenfootImage img;
        Actor edificio = getOneIntersectingObject( Colgantes.class );
        if( edificio != null )
        {
            img = edificio.getImage();
            ancho = img.getWidth();
            alto = img.getHeight();
            x = edificio.getX() - ancho / 2;
            y = edificio.getY() - alto / 2;
            if( super.getX() + 5 > x && super.getX() < x + ancho + 20 && super.getY() + 10 > y - 5 && super.getY() + 10 < y + 10 )
            {
                res = true;
            }
        }
        return res; 
    }
    /**
     * Regresa true si spiderman llego a la parte de abajo del escenario
     * de lo contrario regresa false
     */
    public boolean esPizo()
    {
        boolean res = false;
        if( super.getY() == getWorld().getHeight() - 1 )
            res = true;
        return res;
    }
   /**
    * elimina a spiderman
    */
   public void muere()
   {
       World mundo = getWorld();
       mundo.removeObject( this );
   }
   /**
    * evalua el fondo y muestra la imagen correspondente
    */
   public boolean avanzaFondo()
   {
       boolean res = false;
       SpidermanWorld mundo = (SpidermanWorld)getWorld();
       if( super.getX() == super.getWorld().getWidth() - 1 )
       {
            res = true;
            if( ((SpidermanWorld)getWorld()).dameNavances() < 3 )
                ((SpidermanWorld)getWorld()).cambiaNavances();
            switch( nFondo )
            {
                case 0:
                    mundo.setBackground( "f1n1_4.png" );
                    nFondo++;
                    break;
                case 1:
                    mundo.setBackground( "f1n1_5.png" );
                    nFondo++;
                    break;
                case 2:
                    mundo.setBackground( "f1n1_6.png" );
                    nFondo++;
                    break;
                case 3:
                    mundo.setBackground( "f1n1_3.png" );
                    nFondo = 3;
                    break;
            }
       }
       return res;
   }
   /**
    * evaluando el numero de avance pone los edificios en el escenario
    */
   public void setEdificios(  )
   {
       int r = Greenfoot.getRandomNumber( 4 );
       Actor e1,e2,e3;
       e1 = new Edificio();
       e2 = new Edificio();
       e3 = new Edificio();
       switch( r )
       {
           case 0:
                e1.setImage( "e6.png" );
                e2.setImage( "e3.png" );
                e3.setImage( "e4.png" );
                break;
           case 1:
                e1.setImage( "e5.png" );
                e2.setImage( "e.png" );
                e3.setImage( "e3.png" );
                break;
           case 2:
                e1.setImage( "e7.png" );
                e2.setImage( "e3.png" );
                e3.setImage( "e2.png" );
                break;
           case 3:
                e1.setImage( "e4.png" );
                e2.setImage( "e.png" );
                e3.setImage( "e5.png" );
                break;
                
       }
       getWorld().addObject( e1, 95, 400 );
       getWorld().addObject( e2, 388, 400 );
       getWorld().addObject( e3, 645, 400 );
       super.setLocation( 20, 20 );
   }   
   /**
    * cambia la bandera que indica si ya se puede lanzar la otra bala
    */
   public void cambiaSigBala()
   {
       sigBala = true;
   }
   /**
    * cambia la bandera si se lanzo la telaraña 
    * @param r valor que tendra la bandera que indica si se lanzo la telaraña
    */
   public void cambialanzoTelarana( boolean r )
   {
       lanzoTelarana = r;
   }
}
